.text
.section .rodata
.LC0:
    .string "Input up to %d lines, and I will sort them.\n"
.LC1:
    .string "To stop, press the Enter key at a line''s start."
.LC2:
    .string "\nHere''s the sorted list:"

.text
.globl main
.type main, @function
main:
    addi sp, sp, -1824
    sd ra, 1816(sp)
    sd s0, 1808(sp)
    addi s0, sp, 1808

    // 又到了分配栈空间的时间
    // input: 起始地址-1620(s0)
    // ptstr: 起始地址-1780(s0)
    // ct: -1784(s0)
    // k: -1788(s0)

    sw zero, -1784(s0) /* ct */
    lui a5, %hi(.LC0)
    addi a0, a5, %lo(.LC0)
    li a1, 20 /* LIM */
    call printf

    lui a5, %hi(.LC1)
    addi a0, a5, %lo(.LC1)
    call puts

    j .WHILE_16_COMPARE
.WHILE_16_ENTER:
    lw a5, -1784(s0) /* ct*/
    sext.w a5, a5
    li a6, 81
    mul a5, a5, a6
    add a5, s0, a5
    addi a5, a5, -1620
    lw a6, -1784(s0) /* ct*/
    sext.w a6, a6
    // 乘以8
    slli a6, a6, 3
    add a6, s0, a6
    addi a6, a6, -1780
    sd a5, 0(a6)
.WHILE_16_INCR:
    lw a5, -1784(s0) /* ct*/
    addiw a5, a5, 1
    sw a5, -1784(s0) /* ct*/
.WHILE_16_COMPARE:
    lw a5, -1784(s0) /* ct*/
    sext.w a5, a5
    li a6, 20 /* LIM */
    bge a5, a6, .WHILE_16_COMPLETE
    li a6, 81
    mul a5, a5, a6
    add a5, s0, a5
    addi a0, a5, -1620
    li a1, 81 /* SIZE */
    call s_gets
    beq a0, zero, .WHILE_16_COMPLETE
    lw a5, -1784(s0) /* ct*/
    sext.w a5, a5
    li a6, 81
    mul a5, a5, a6
    add a5, s0, a5
    addi a5, a5, -1620
    lb a5, (a5)
    sext.b a5, a5
    beq a5, zero, .WHILE_16_COMPLETE
    j .WHILE_16_ENTER
.WHILE_16_COMPLETE:
    addi a0, s0, -1780
    lw a1, -1784(s0) /* ct*/
    call stsrt

    lui a5, %hi(.LC2)
    addi a0, a5, %lo(.LC2)
    call puts

    sw zero, -1788(s0) /* k */
    j .FOR_23_COMPARE
.FOR_23_ENTER:
    lw a5, -1788(s0) /* k */
    sext.w a5, a5
    slli a5, a5, 3
    add a5, s0, a5
    addi a5, a5, -1780
    ld a0, 0(a5)
    call puts
.FOR_23_INCR:
    lw a5, -1788(s0) /* k */
    addiw a5, a5, 1
    sw a5, -1788(s0) /* k */
.FOR_23_COMPARE:
    lw a5, -1788(s0) /* k */
    sext.w a5, a5
    lw a6, -1784(s0) /* ct*/
    sext.w a6, a6
    blt a5, a6, .FOR_23_ENTER

    ld ra, 1816(sp)
    ld s0, 1808(sp)
    addi sp, sp, 1824
    jr ra

// TODO 比较还没生效
.text
.globl stsrt
.type stsrt, @function
stsrt:
    addi sp, sp, -48
    sd ra, 40(sp)
    sd s0, 32(sp)
    addi s0, sp, 32

    // 局部变量和参数坑位
    // strlist: -8(s0)
    // num: -12(s0)
    // tmp: -20(s0)
    // i: -24(s0)
    // j: -28(s0)

    sd a0, -8(s0) /* strlist */
    sw a1, -12(s0) /* num */
    sw zero, -24(s0) /* i */
    j .FOR_33_COMPARE
.FOR_33_ENTER:
    lw a5, -24(s0) /* i */
    addiw a5, a5, 1
    sw a5, -28(s0) /* j */
    j .FOR_35_COMPARE
    .FOR_35_ENTER:
        ld a6, -8(s0) /* strlist */
        lw a5, -24(s0) /* i */
        sext.w a5, a5
        slli a5, a5, 3
        add a5, a5, a6
        ld a0, 0(a5)
        lw a5, -28(s0) /* j */
        sext.w a5, a5
        slli a5, a5, 3
        add a5, a5, a6
        ld a1, 0(a5)
        call strcmp
        ble a0, zero, .FOR_35_INCR
    .FOR_35_EXCHAGE:
        ld a6, -8(s0) /* strlist */
        lw a5, -24(s0) /* i */
        sext.w a5, a5
        slli a5, a5, 3
        add a5, a5, a6
        ld a5, 0(a5)
        sd a5, -20(s0) /* tmp */
        lw a5, -24(s0) /* i */
        sext.w a5, a5
        slli a5, a5, 3
        add a7, a5, a6
        // ld a1, 0(a5)
        lw a5, -28(s0) /* j */
        sext.w a5, a5
        slli a5, a5, 3
        add a5, a5, a6
        ld a4, 0(a5)
        sd a4, 0(a7)
        ld a6, -20(s0) /* tmp */
        sd a6, 0(a5)
    .FOR_35_INCR:
        lw a5, -28(s0) /* j */
        addiw a5, a5, 1
        sw a5, -28(s0) /* j */
    .FOR_35_COMPARE:
        lw a5, -28(s0) /* j */
        sext.w a5, a5
        lw a6, -12(s0) /* num */
        sext.w a6, a6
        blt a5, a6, .FOR_35_ENTER
.FOR_33_INCR:
    lw a5, -24(s0) /* i */
    addiw a5, a5, 1
    sw a5, -24(s0) /* i */
.FOR_33_COMPARE:
    lw a5, -24(s0) /* i */
    sext.w a5, a5
    lw a6, -12(s0) /* num */
    sext.w a6, a6
    blt a5, a6, .FOR_33_ENTER

    ld ra, 40(sp)
    ld s0, 32(sp)
    addi sp, sp, 48
    jr ra

.text
.globl s_gets
.type s_gets, @function
s_gets:
    addi sp, sp, -48
    sd ra, 40(sp)
    sd s0, 32(sp)
    addi s0, sp, 32

    // 根据x86的经验，就不存参数了，按照通用的规矩是要存的
    // ret_val: -8(s0)
    // i: -12(s0)

    // 不行，不存参数是不行的，因为调用fgets后，返回值会把a0覆盖了。
    // st:-20(s0)
    // n: -24(s0)
    sd a0, -20(s0) /* st */
    sw a1, -24(s0) /* n */
    sw zero, -12(s0) /* i */

    // 以下两行实际不需要，不过协助这里，万一中间插了代码把a0和a1覆盖了呢
    ld a0, -20(s0) /* st */
    lw a1, -24(s0) /* n */
    lui a5, %hi(stdin)
    ld a2, %lo(stdin)(a5)
    call fgets

    sd a0, -8(s0) /* ret_val */
    beq a0, zero, .EXIT

    j .WHILE_15_COMPARE
.WHILE_15_ENTER:
    lw a5, -12(s0) /* i */
    addiw a5, a5, 1
    sw a5, -12(s0) /* i */
.WHILE_15_COMPARE:
    lw a5, -12(s0) /* i */
    sext.w a5, a5
    ld a4, -20(s0) /* st */
    add a5, a4, a5
    lbu a5, (a5)
    li a4, 10
    beq a5, a4, .IF_17
    bne a5, zero, .WHILE_15_ENTER
.IF_17:
    lw a5, -12(s0) /* i */
    sext.w a5, a5
    ld a4, -20(s0) /* st */
    add a5, a4, a5
    lbu a6, (a5)
    li a4, 10
    bne a6, a4, .WHILE_20_ENTER
    sb zero, (a5)
    j .EXIT
.WHILE_20_ENTER:
    call getchar
    li a5, 10
    bne a0, a5, .WHILE_20_ENTER
.EXIT:
    ld a0, -8(s0) /* ret_val */
    ld ra, 40(sp)
    ld s0, 32(sp)
    addi sp, sp, 48
    jr ra
